#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*
    Node是链表的基础单位
    包含了存储的数据和下一个节点的位置
    (Ps 结构体无所谓叫什么，你哪怕不写都可以，
    直接起别名)
*/
typedef struct Node{
    
}Node;


/*
    先只写单链表 只需要有一个头结点
*/
typedef struct SingleList{

}SingleList;

/*
    创建新节点 分三步 
    申请内存(如果申请失败就退出)，赋值，返回
*/
Node* createNode(int data){
    
}

/*
    创建单链表 
    申请内存(申请失败就退出) 头节点置为空 返回
*/
SingleList* createList(){

}


/*
    isEmpty是用来判断是否是空链表
    返回头结点是否为空即可
*/
bool isEmpty(SingleList* list);

/*
    头插法
    检测是否是空 空就让头结点等于新节点
    如果不空
    创建新节点 头结点后移 新节点成为头结点
*/
void insertAtHead(SingleList* list,int data);



/*
    尾插法
    检测是否为空 同上
    不空 创建节点 遍历到最后一个节点
    使得最后一个节点的下一个赋值为 新节点
*/
void insertAtTail(SingleList* list,int data);

/*
    在任意位置插入 
    判断位置是否有效
    位置是否是头结点  直接头插法 
    创建新节点 用从头结点开始的当前节点和空的先前节点
    用一个计算位置 然后节点不断向后移动 同时计数
    最后 先前节点的下一个节点就是 新节点 新节点的下一个就是当前节点
*/
void insertAtPosition(SingleList* list,int data,int position);

/*
    删除节点 
    空链表就提示空
    首先确定删除的是不是头结点 
    如果是头结点，把头结点存在一个临时节点中，删除临时节点
    头结点 = 头结点的下一个节点 
    不是 还是当前节点和先前节点从头结点开始遍历
    如果不是我要删除的数据，就继续遍历
    如果是 把先前的下一个节点改为当前的下一个节点
    并释放当前节点 否则 删除的元素不存在
*/
void deleteNode(SingleList* list,int data);

/*
    display是用来显示链表当中的元素
    是否为空 
    空 提示 
    不空 从头结点开始遍历到最后一个节点，一边遍历 边输出
*/
void display(SingleList* list);


/*
    查找某个元素在链表当中是否存在
    检验是否为空链表
    空 当然不存在
    不空 头节点开始 查找是否有 和 data相等的节点 
    没有就继续往下遍历。如果遍历完了没有 那也当然不存在
*/
bool search(SingleList* list,int data);


int main(){
    return 0;
}
